//qsort函数的实现,通用的冒泡排序
#include <stdio.h>
#include <string.h>

void swap(char* str1 , char* str2, int width)//一个字节一个字节地交换
{
    for(int i=0;i<width;i++)
    {
        char tmp = *str1;
        *str1 = *str2;
        *str2 = tmp;
        str1++;
        str2++;
    }
}

void my_qsort//qsort 函数的实现
            (
                void* base,
                unsigned int sz,
                unsigned int width,
                int (*cmp) (const void* e1,const void* e2)
            )
{
    for(int i=0;i<sz;i++)
    {
        int j=0;
        for(j=0;j<sz-1-i;j++)
        {
            if( cmp( (char*)base+j*width , (char*)base+(j+1)*width )>0 )//以所传元素首地址为基础，元素类型所占字节为跨度
            {
                swap((char*)base+j*width , (char*)base+(j+1)*width , width);
            }
        }
    }
}
struct stdu
{
    char name[20];
    int age;
};

int sortby_age(const void*e1 , const void* e2)
{
    return ((struct stdu*)e1)->age-((struct stdu*)e2)->age;
}

int sortby_name(const void*e1 , const void* e2)
{
    return strcmp(((struct stdu*)e1)->name,((struct stdu*)e2)->name);
}

int sortby_int(const void*e1 , const void* e2)
{
    return *(int*)e1 - *(int*)e2;
}

int main()
{
    struct stdu st[]={{"xiaozhanga",21},{"wangwu",43},{"zhangsan",18},{"lisi",38}};
    int arr[]={1,3,9,7,5,2,8,4,6,10};
    int sz = sizeof(arr)/sizeof(arr[0]);
    //int sz = sizeof(st)/sizeof(st[0]);
    //my_qsort(st,sz,sizeof(st[0]),sortby_age);
    //my_qsort(st,sz,sizeof(st[0]),sortby_name);
    my_qsort(arr,sz,sizeof(arr[0]),sortby_int);
    return 0;
}